package com.tanger.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @Description Map工具类
 * @Author Hchenbin
 * @Date 2022/6/28 15:30
 * @Version 1.0
 */
public class MapUtils {

    private static Logger logger = LoggerFactory.getLogger(MapUtils.class);

    /**
     * 把source转为target
     * @param source source
     * @param target target
     * @param <T> 返回值类型
     * @return 返回值
     * @throws Exception newInstance可能会抛出的异常
     */
    public static <T> T toObj(LinkedHashMap source, Class<T> target){
        try {
            Field[] fields = target.getDeclaredFields();
            T o = target.newInstance();
            for(Field field:fields){
                Object val;
                if((val=source.get(field.getName()))!=null){
                    field.setAccessible(true);
                    field.set(o,val);
                }
            }
            return o;
        }catch (Exception e){
            logger.warn("Convert exceptions"+e.getMessage());
            return null;
        }
    }


    /**
     * 将请求参数与数值放入Map中
     * @param request 请求对象
     * @return
     */
    public static Map<String,Object> formatRequestParams(HttpServletRequest request){
        Map<String,Object> map = new HashMap<>();
        //request.getParameterNames 将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举.
        Enumeration<String> paramNames=request.getParameterNames();
        //通过Enumeration的hasMoreElements()方法遍历
        while (paramNames.hasMoreElements()) {
            //再由nextElement()方法获得枚举的值.此时的值是form表单中所有控件的name属性的值.
            String paramName = paramNames.nextElement();
            //request.getParameterValues 将获取所有form表单中name属性为"name"的值.该方法返回一个数组.遍历数组就可得到value值.
            String[] paramValues = request.getParameterValues(paramName);
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() != 0) {
                    map.put(paramName, paramValue);
                }
            }
        }
        return map;
    }
}
